#ifndef COMPONENT_H
#define COMPONENT_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h> // For FILE* maybe, or size_t

// 前向声明
typedef struct SupplierNode SupplierNode;

// 定义字符串字段的最大长度
#define COMPONENT_MODEL_LEN 64
#define COMPONENT_NAME_LEN 128
#define COMPONENT_PACKAGE_LEN 32
#define COMPONENT_DESCRIPTION_LEN 256
#define IMAGE_PATH_LEN 256

// 组件信息结构体
typedef struct {
    int id;                                 // 唯一组件ID
    char model[COMPONENT_MODEL_LEN];        // 组件型号 (例如: STM32F103C8T6)
    char name[COMPONENT_NAME_LEN];          // 组件名称 (例如: ARM Cortex-M3 微控制器)
    char package[COMPONENT_PACKAGE_LEN];    // 封装类型 (例如: LQFP48, DIP, SMD0805)
    char description[COMPONENT_DESCRIPTION_LEN]; // 简要描述
    int supplier_id;                        // 供应商ID (关联到 Supplier 结构体)
    int quantity;                           // 当前库存数量
    float price;                            // 价格 - 移到第8个字段匹配文件格式
    char image_path[IMAGE_PATH_LEN];        // 组件图片路径 - 移到最后
    // 根据需要添加其他相关字段，例如:
    // char datasheet_url[256];          // 数据手册URL
    // char location[64];                // 存放位置
} Component;

// 组件链表节点结构体
typedef struct ComponentNode {
    Component data;
    struct ComponentNode* next;
} ComponentNode;

// --- 组件管理函数声明 ---

// 从文件加载组件到链表。返回加载的组件数量。
int load_components(const char* filename, ComponentNode** head);

// 将链表中的组件保存到文件。返回保存的组件数量。
int save_components(const char* filename, ComponentNode* head);

// 向链表中添加新组件。成功返回1，ID已存在返回0。
int add_component(ComponentNode** head, const Component* new_component);

// 从链表中删除指定ID的组件。成功返回1，未找到返回0。
int delete_component(ComponentNode** head, int component_id);

// 按ID查找组件。找到返回节点指针，否则返回NULL。
ComponentNode* find_component_by_id(ComponentNode* head, int component_id);

// 更新现有组件的信息。成功返回1，未找到返回0。
int update_component(ComponentNode* head, const Component* updated_component);

// 释放组件链表分配的内存。
void free_all_components(ComponentNode* head);

// (可选：稍后添加查询函数，例如按型号查找组件)

// --- 数据验证函数声明 ---

// 验证组件ID：纯数字，1-10位
int validate_component_id(int id);

// 验证供应商ID：纯数字，1-6位
int validate_supplier_id(int supplier_id);

// 验证组件型号：字母数字组合，无空格，2-30字符，拒绝中文、特殊符号(除-_)
int validate_component_model(const char* model);

// 验证组件名称：中英文+数字，1-50字符，拒绝特殊符号(除空格)、纯符号
int validate_component_name(const char* name);

// 验证封装：大写字母+数字组合，2-20字符，拒绝小写字母、中文、特殊符号
int validate_component_package(const char* package);

// 验证描述：可选，最大200字符，支持中英文，拒绝超长文本、恶意脚本标签
int validate_component_description(const char* description);

// 验证库存：非负整数，0-999999
int validate_component_quantity(int quantity);

// 验证价格：正数，最多2位小数，0.01-99999.99
int validate_component_price(float price);

// 完整验证组件数据（基础版本）
int validate_component_data(const Component* component, char* error_msg, int error_msg_size);

// 验证供应商是否存在
int validate_supplier_exists(int supplier_id, SupplierNode* supplier_head);

// 完整验证组件数据（包含供应商存在性检查）
int validate_component_data_with_suppliers(const Component* component, SupplierNode* supplier_head, char* error_msg, int error_msg_size);

// 清理价格字符串（移除货币符号）
void clean_price_string(char* price_str);

// 填充默认描述
void fill_default_description(char* description, int max_len);

#ifdef __cplusplus
}
#endif

#endif // COMPONENT_H